const { messageModel, NoticeModel } = require("../models/model");
const WebSocket = require("ws");
// 设置 WebSocket 服务器的函数
const setupWebSocket = (server) => {
  // 创建 WebSocket 服务器
  const wss = new WebSocket.Server({ server });
  const clients = new Set(); // 存储所有连接的客户端
  const HEARTBEAT_INTERVAL = 60000; // 心跳间隔 (30秒)
  const HEARTBEAT_TIMEOUT = 10000; // 心跳超时 (10秒)
  const changeStream = messageModel.watch();
  // 当新客户端连接到服务器时触发
  wss.on("connection", (ws) => {
    clients.add(ws); // 将新连接的客户端添加到集合中
    console.log("New client connected");
    let heartbeatTimer; // 心跳定时器
    // 监听数据库变化
    changeStream.on("change", (change) => {
      if (change.operationType === "insert") {
        const content = change.fullDocument;
        ws.send(JSON.stringify({ type: "reminding", content })); // 发送新消息到客户端
      }
    });
    // 启动心跳机制
    const startHeartbeat = () => {
      heartbeatTimer = setInterval(() => {
        if (ws.readyState === WebSocket.OPEN) {
          // 每隔 HEARTBEAT_INTERVAL 发送心跳消息
          ws.send(JSON.stringify({ type: "heartbeat", content: "心跳消息" }));
        }
      }, HEARTBEAT_INTERVAL);
    };
    // 停止心跳机制
    const stopHeartbeat = () => {
      clearInterval(heartbeatTimer);
    };

    // 当收到消息时，重置心跳状态
    const checkHeartbeat = () => {
      ws.isAlive = true;
    };

    // 处理收到的消息
    ws.on("message", (message) => {
      // 处理传入的消息并重置心跳状态
      console.log(message, "abcdefg");

      handleIncomingMessage(ws, message); // 处理传入的消息
      checkHeartbeat(); // 收到消息时重置心跳状态
    });

    // 当前客户端断开连接时触发
    ws.on("close", () => {
      stopHeartbeat(); // 停止心跳机制
      clients.delete(ws); // 从集合中删除当前客户端
      console.log("Client disconnected");
    });

    // 初始化 isAlive 属性以监测客户端存活状态
    ws.isAlive = true;

    // 处理 pong 响应以重置客户端存活状态
    ws.on("pong", () => {
      ws.isAlive = true; // 收到 pong 响应时，将 isAlive 设置为 true
    });

    startHeartbeat(); // 启动心跳机制

    // 检查活动状态并维护连接
    const heartbeatCheck = setInterval(() => {
      clients.forEach((client) => {
        if (client.isAlive === false) {
          console.log("Terminating client due to inactivity");
          return client.terminate(); // 如果客户端不活跃，则终止连接
        }
        client.isAlive = false; // 标记客户端为不活跃
        client.ping(); // 发送 ping 消息以检测连接
      });
    }, HEARTBEAT_TIMEOUT); // 每个心跳超时周期检查所有客户端的活跃状态

    // 清理定时器
    ws.on("close", () => {
      clearInterval(heartbeatCheck); // 客户端断开连接时清理定时器
    });
  });

  // 处理接收到的消息，广播给其他客户端
  const handleIncomingMessage = async (sender, message) => {
    // 如果接收到的是 Buffer，则转换为字符串
    const messageString = Buffer.isBuffer(message)
      ? message.toString()
      : message;
    try {
      const data = JSON.parse(messageString); // 尝试解析 JSON
      if (data.type === "Person") {
        console.log("Parsed data:聊天信息", data); // 打印接收到的消息
        // 进一步处理数据将数据存入 MongoDB 并推送到所有客户端
        await messageModel.create(data);
      } else if (data.type === "Notices") {
        console.log("Parsed data:公告信息", data); // 打印接收到的消息
        // 进一步处理数据将数据存入 MongoDB 并推送到所有客户端
        await NoticeModel.create(data.message);
      }
    } catch (error) {
      console.error("JSON Parsing Error:", error); // 输出解析错误
      // 错误处理逻辑
    }
    clients.forEach((client) => {
      // 除了发送者外，向其他所有客户端发送消息
      if (client !== sender && client.readyState === WebSocket.OPEN) {
        console.log("Received message2:", messageString); // 为每个客户端打印消息
        sendMessage(client, messageString); // 发送消息
      }
    });
  };

  // 发送消息函数，处理异常
  const sendMessage = (client, message) => {
    try {
      client.send(message); // 发送消息给指定客户端
    } catch (error) {
      console.error(`Failed to send message to ${client}:`, error); // 打印错误信息
    }
  };
};

module.exports = setupWebSocket; // 导出 WebSocket 设置函数
